export default class Page<T> {
    // 总记录数
    public totalElements_: number = 0;
    // 查询的每页数量
    public size: number = 10;
    // 当前页，后端从0开始，前端从1开始
    public number: number = 0;
    // 当前页的记录数量
    public numberOfElements: number = 0;
    // 数据内容
    public content_: T[] = [];

    // 总页数，不使用后端输出值
    public get totalPages(): number {
        return Math.ceil(this.totalElements_ / this.size);
    }

    public get totalElements(): number {
        return this.totalElements_;
    }

    // 后端输出的totalElements，因为是long，所以转为了string
    public set totalElements(v: string) {
        this.totalElements_ = Number(v).valueOf();
    }

    // 显示的数据内容，只显示size条。经过多次insert操作后，content.size > size
    public get content(): T[] {
        return this.content_.slice(0, this.size);
    }

    public set content(v: T[]) {
        this.content_ = v;
    }

    // 新增记录后，操作本地数据集
    public addElement(element: T) {
        this.content_.unshift(element);
        this.totalElements_++;
    }

    // 修改记录后，只操作本地数据集
    public updateElement(element: T, key: (e: T) => any) {
        const index = this.content_.findIndex((item) => key(item) === key(element));
        if (index >= 0) {
            this.content_[index] = element;
        }
    }

    // 删除记录后，只操作本地数据集
    public removeElement(element: T, key: (e: T) => any) {
        const index = this.content_.findIndex(item => key(item) === key(element));
        if (index >= 0) {
            this.content_.splice(index, 1);
        }
        this.totalElements_--;
    }

    // 批量删除记录，
    public removeElements(elements: T[], key: (e: T) => any) {
        elements.forEach(element => this.removeElement(element, key));
    }
}

